<?php
// 应用公共文件
use PHPMailer\PHPMailer\PHPMailer;
// 生成密码盐
if (!function_exists('build_ranstr')) {
    /**
     * 获得随机字符串
     * @param   Number  $len    需要的长度
     * @param   Bool    $special    是否需要特殊符号
     * @return  String  返回随机字符串
     */
    function build_ranstr($len = 8, $special = false)
    {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );

        if ($special) {
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                "}", "<", ">", "~", "+", "=", ",", "."
            ));
        }

        $charsLen = count($chars) - 1;
        shuffle($chars);                            //打乱数组顺序
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }
        return $str;
    }
}
// 单图上传
if (!function_exists('upload')) {
    /**
     * @param String $name 图片名
     * @return Array 返回结果
     */
    function upload($name)
    {
        try {
            $file = request()->file($name);
            if ($file) {
                $FileName = \think\facade\Filesystem::disk('upload')->putFile('upload', $file);
                if ($FileName) {
                    $FileName = '/' . str_replace('\\', '/', $FileName);
                    return ['code' => 1, 'msg' => '上传成功', 'data' => $FileName];
                }
            }
        } catch (\Exception $e) {
            return ['code' => 0, 'msg' => $e->getMessage()];
        }
    }
}
// 多图上传
if (!function_exists('uploads')) {
    /**
     * 多图上传
     * @param String $name 字段名
     * @return Array       上传文件结果数组
     */
    function uploads($name)
    {
        try {
            // 接收到所有的图片
            $files = request()->file($name);

            // 定义一个空的数组
            $List = [];

            if (count($files) > 0) {
                foreach ($files as $item) {
                    // 保存指定目录
                    $FileName = \think\facade\Filesystem::disk('upload')->putFile('upload', $item);
                    // 把\替换/
                    $FileName = str_replace('\\', '/', $FileName);

                    $List[] = $FileName;
                }
                if (count($List) > 0) {
                    // 返回结果
                    return ['code' => 1, 'msg' => '上传成功', 'data' => $List];
                }
            }
        } catch (\Exception $e) {
            return ['code' => 0, 'msg' => $e->getMessage(), 'data' => []];
        }
    }
}
// 邮箱认证
if (!function_exists('EmailSend')) {
    /**
     * 发送电子邮件
     * @param   String  $name   收件人名称
     * @param   String  $Address  收件人邮箱
     * @param   String  $content    正文
     * @return  Bool    返回布尔值
     */

    function EmailSend($name, $Address, $content = '未知内容')
    {
        // 实例化邮箱发送对象
        $mail = new PHPMailer(true);

        // 启用smtp
        $mail->isSMTP(true);

        // SMTP服务器 qq => smtp.qq.com
        $mail->Host = 'smtp.qq.com';

        // 开启smtp认证
        $mail->SMTPAuth = true;

        // 发送内容支持HTML
        $mail->IsHTML(true);

        // 邮箱用户名 => SMTP账号
        $mail->Username = '1963283930@qq.com';

        // 密码 => 授权码
        $mail->Password = 'lmpbbkyuourpdbac';

        // 设置SMTP服务端口 上线后需要服务器开启465这个端口 
        //设置端口  发信服务器端口号,加密端口一般是465，普通端口25
        $mail->Port = 465;

        // 协议
        $mail->SMTPSecure = 'ssl';
        
        // 发件人
        $mail->setFrom('1963283930@qq.com', 'ASK论坛');

        // 设置回复邮箱
        $mail->addReplyTo('1963283930@qq.com', 'ASK论坛');

        // 收件人
        $mail->addAddress($Address, $name);

        // 主题
        $mail->Subject = 'ASK论坛邮箱认证激活';

        // 设置换行
        $mail->WordWrap = 80;

        // 发送内容
        $mail->msgHTML($content);

        // 发送
        $result = $mail->send();

        if ($result) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('CommentTree')) {
    //创建一个公共函数，来处理评论的递归  处理数据
    /**
     * @param list 评论数据
     * @param pid 评论上一级id
     * @param User 用户
     */
    function CommentTree($list, $pid = 0, $User)
    {
        // 定义空的数组
        $data = [];

        if ($list) {
            // 循环评论数据
            foreach ($list as $item) {
                // 评论里的点赞字段不为空
                if (!empty($item['like'])) {
                    //字符串转数组
                    $LikeArr = explode(',', $item['like']);
                    $LikeArr = array_filter($LikeArr);  //去除数组中的空元素

                    // 获取点赞的总数
                    $LikeCount = is_array($LikeArr) ? count($LikeArr) : 0;

                    // 自定义一个数据表不存在的字段
                    $item['like_count'] = $LikeCount;

                    //判断当前这一条评论是不是本人点过赞
                    if (in_array($User['id'], $LikeArr)) {
                        // 点过赞
                        $item['active'] = true;
                    } else {
                        $item['active'] = false;
                    }
                } else {
                    //当like字段为空
                    $item['like_count'] = 0;
                }

                //id = 1 pid = 0
                if ($item['pid'] == $pid) {
                    //找出相等pid值，给当前的评论新增一个自定义属性
                    //递归找子集
                    $item['child'] = CommentTree($list, $item['id'], $User);
                    $data[] = $item;
                }
            }
        }
        return $data;
    }
}

if (!function_exists('CommentHtml')) {
    //处理递归循环输出  处理输出
    /**
     * @param list 评论数据
     * @param post 当前帖子数据
     * @param flag 是否为父级评论
     * @return output 返回递归数据
     */
    function CommentHtml($list, $post, $LoginUser, $flag = 'top', $output = "")
    {
        // $output = "";

        foreach ($list as $key => $item) {
            // 外边距
            $PaddingLeft = $item['level'] * 1;

            $output .= "<li style='padding-left:{$PaddingLeft}em' class='jieda-daan'>";
            // 头像
            $output .= "<div class='detail-about detail-about-reply'>";
            // 头像
            $url = url('home/user/index', ['userid' => $item['userid']]);
            $output .= "<a class='fly-avatar' href='$url'>";

            //判断头像
            if (is_file('.' . $item['user']['avatar'])) {
                $avatar = $item['user']['avatar'];
                $output .= "<img src='$avatar' />";
            } else {
                $output .= "<img src='/static/home/res/images/avatar/default.png' />";
            }
            $output .= "</a>";


            // 用户信息
            $output .= "<div class='fly-detail-user'>";
            $output .= "<a href='javascript:void(0)' class='fly-link'>";
            $nickname = $item['user']['nickname'];
            $output .= " <cite>$nickname</cite>";

            if ($item['user']['auth'] > 0) {
                $output .= "<i class='iconfont icon-renzheng'></i>";
            }
            $output .= "</a>";

            // 楼主
            if ($flag == 'top') {
                $output .= "<span style='color:#FF7200'>(楼主)</span>";
            }

            // 判断是否为发帖人
            if ($item['userid'] == $post['userid']) {
                $output .= "<span style='color:#5FB878'>(发帖人)</span>";
            }
            $output .= "</div>";

            // 评论时间
            $output .= "<div class='detail-hits'>";
            $output .= "<span>{$item['createtime']}</span>";
            $output .= "</div>";


            // 采纳图标
            if ($item['accept'] == 1) {
                $output .= "<i class='iconfont icon-caina' title='最佳答案'></i>";
            }
            $output .= "</div>";

            // 评论内容
            $output .= "<div class='detail-body jieda-body photos'>";
            $output .= "<p>{$item['content']}</p>";
            $output .= "</div>";

            // 回复
            if (cookie('LoginUser')) {
                $output .= "<div class='jieda-reply'>";
                // 点赞
                if ((!empty($item['active']))) {

                    $output .= "<span class='jieda-zan zanok' data-id='{$item['id']}' type='zan'>";
                } else {
                    $output .= "<span class='jieda-zan' data-id='{$item['id']}' type='zan'>";
                }
                $output .= "<i class='iconfont icon-zan'></i>";
                $output .= "<em>{$item['like_count']}</em>";
                $output .= "</span>";

                // 回复
                if (!$post['accept']) {
                    $pid = $item['id'];
                    $nickname2 = $item['user']['nickname'];
                    $output .= "<a href='#comment' class='reply' type='reply' data-pid='$pid' data-nickname='$nickname2'>";
                    $output .= "<i class='iconfont icon-svgmoban53'></i>\r\n回复";
                    $output .= "</a>";
                }
                $output .= "<div class='jieda-admin'>";
                // (登录的人 == 发帖userid) 发帖人  || 评论本人（评论人 == 登录的人）

                $userid = !empty($LoginUser['id']) ? $LoginUser['id'] : 0;

                if ($userid == $post['userid'] || $userid == $item['userid']) {
                    if (!$post['accept']) {
                        $output .= " <span type='del' data-comid='{$item['id']}'>删除</span>";
                    }
                }

                // 登录用户 == 发帖人 => 给采纳图标
                if ($userid == $post['userid'] && $item['userid'] != $userid) {
                    if (!$post['accept']) {
                        $output .= "<span class='accept' data-comid='{$item['id']}' class='jieda-accept' type='accept'>";
                        $output .= "采纳";
                        $output .= "</span>";
                    }
                }
                $output .= "</div>";

                $output .= "</div>";
            }
            $output .= "</li>";

            //判断是否有子集
            if (!empty($item['child'])) {
                $output = CommentHtml($item['child'], $post, $LoginUser, 'son', $output);
            }
        }

        return $output;
    }
}

if (!function_exists('getSubTree')) {
    /**
     * data 二维数组
     * pid 上级ID
     * level 等级
     */
    function getSubTree($data, $pid = 0, $level = 0)
    {
        $tmp = [];
        foreach ($data as $key => $item) {
            if ($item['pid'] == $pid) {
                $item['level'] = 0;
                $tmp[] = $item;
                $tmp = array_merge($tmp, getSubTree($data, $item['id'], $level + 1));
            }
        }
        return $tmp;
    }
}
// 生成订单号
if (!function_exists('build_code')) {

    /**
     * 生成唯一订单号
     *
     * @param string $path 指定的path
     * @return string
     */
    function build_code($prefix = "")
    {
        @date_default_timezone_set("PRC");
        $order_id_main = date('YmdHis') . rand(10000, 99999);
        //订单号码主体长度
        $order_id_len = strlen($order_id_main);
        $order_id_sum = 0;
        for ($i = 0; $i < $order_id_len; $i++) {
            $order_id_sum += (int)(substr($order_id_main, $i, 1));
        }
        //唯一订单号码（YYYYMMDDHHIISSNNNNNNNNCC）
        $osn = $prefix . $order_id_main . str_pad((100 - $order_id_sum % 100) % 100, 2, '0', STR_PAD_LEFT); //生成唯一订单号
        return $osn;
    }
}
if (!function_exists('get_weeks')) {
    /**
     * 获取最近七天所有日期
     */
    function get_weeks($time = '', $format = 'Y-m-d')
    {
        $time = $time != '' ? $time : time();
        //组合数据
        $date = [];
        for ($i = 1; $i <= 7; $i++) {
            $date[$i] = date($format, strtotime('+' . $i - 7 . ' days', $time));
        }
        return $date;
    }
}
if (!function_exists('get_week')) {
    /**
     * 获取本周所有日期
     */
    function get_week($time = '', $format = 'Y-m-d')
    {
        $time = $time != '' ? $time : time();
        //获取当前周几
        $week = date('w', $time);
        $date = [];
        for ($i = 1; $i <= 7; $i++) {
            $date[$i] = date($format, strtotime('+' . $i - $week . ' days', $time));
        }
        return $date;
    }
}
